package com.facebook.games.fa.model
{
	import flash.utils.ByteArray;

	/**
	 * Atleta
	 * @author Diego Maehler <dmaehler@gmail.com>
	 */
	[Bindable]
	public class Athlete
	{
		
		public var id : int;
		
		/**
		 * Nome
		 */
		public var name : String;
		
		/**
		 * Imagem do atleta
		 */
		public var photo : ByteArray;
		
		/**
		 * Equipe a qual ele joga
		 */
		public var team : Team;
		
		/**
		 * Força
		 */
		public var strength : Attribute;
		
		/**
		 * Agilidade
		 */
		public var agility : Attribute;
		
		/**
		 * Velocidade
		 */
		public var speed : Attribute;
		
		/**
		 * Altura
		 */
		public var height : Attribute;
		
		/**
		 * Peso
		 */
		public var weight : Attribute;
		
		/**
		 * Carta
		 */
		public var card : Card;
		
		/**
		 * 
		 */
		public function Athlete (strength : Number = NaN, agility : Number = NaN, speed : Number = NaN, height : Number = NaN, weight : Number = NaN)
		{
			this.strength	= new Attribute(Attribute.STRENGHT,	strength);
			this.agility	= new Attribute(Attribute.AGILITY, 	agility);
			this.speed		= new Attribute(Attribute.SPEED, 	speed);
			this.height		= new Attribute(Attribute.HEIGHT, 	height);
			this.weight		= new Attribute(Attribute.WEIGHT, 	weight);
		}
		
		/**
		 * Retorna um array com os atributos do atleta
		 * @return
		 * 		[strenght, agility, speed, height, weight]
		 */
		public function getAttributes () : Array
		{
			return [this.strength, this.agility, this.speed, this.height, this.weight];
		}
		
		/**
		 * Clona os atributos do atleta.
		 * return new Athlete()
		 */
		public function clone () : Athlete
		{
			const newAthlete : Athlete = new Athlete(	this.strength.value, 
														this.agility.value, 
														this.speed.value, 
														this.height.value, 
														this.weight.value);
			
			newAthlete.name 	= this.name;
			newAthlete.photo	= this.photo;
			newAthlete.id		= this.id;
			newAthlete.team		= this.team;
			newAthlete.card		= this.card;
			
			return newAthlete;
			
		}
		
		/**
		 * Retorna um atributo do atleta procurando pelo seu nome
		 * @param attributeName
		 * @return Attribute
		 */
		protected function getAttributeByName (attributeName : String) : Attribute
		{
			switch (attributeName)
			{
				case Attribute.STRENGHT : return this.strength;
				case Attribute.AGILITY	: return this.agility;
				case Attribute.SPEED	: return this.speed;
				case Attribute.HEIGHT	: return this.height;
				case Attribute.WEIGHT	: return this.weight;
			}
			return null;
		}
		
		/**
		 * Acrescenta um valor vindo de uma carta coringa ao atributo
		 * @param attributeName
		 * @param jokerValue
		 */
		public function increaseAttributeValue (attributeName : String, jokerValue : Number) : void
		{
			this.getAttributeByName(attributeName).increaseValue(jokerValue);
		}
		
		/**
		 * Diminui um valor de um atributo que veio de uma carta coringa
		 * @param attributeName
		 * @param jokerValue
		 */
		public function decreaseAttributeValue (attributeName : String, jokerValue : Number) : void
		{
			this.getAttributeByName(attributeName).decreaseValue(jokerValue);
		}
		
		/**
		 * Zera o valor de um atributo
		 * @param atributo
		 */
		public function cancelAttribute (attributeName : String) : void
		{
			this.getAttributeByName(attributeName).value = 0;
		}
		
		/**
		 * Compara o atributo deste atleta com o atributo de outro atleta
		 * @param ahtlete
		 * @param attributeName
		 * @return
		 * 		-1 - O valor do atributo do outro atleta é maior que o valor deste 
		 * 		0 - Os valores são iguais
		 * 		1 - O valor do atributo deste atleta é maior que o do outro atleta
		 */
		public function compareAttribute (athlete : Athlete, attributeName : String) : int
		{
			return this.getAttributeByName(attributeName).compareTo(athlete.getAttributeByName(attributeName));
		}
		
		/**
		 * Retorna o valor de um atributo
		 * @param attributeName
		 * @return
		 */
		public function getAttributeValue (attributeName : String) : Number
		{
			return this.getAttributeByName(attributeName).value;
		}
		
	}
}